#include <iostream>
#include <string>
#include <vector>
#include <functional>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/wait.h>

void PrintfPending(const sigset_t &pending)
{
    std::cout << "curr pending list [" << getpid() << "]: ";
    for (int signo = 31; signo > 0; signo--)
    {
        // 查询pending是或否有
        if (sigismember(&pending, signo))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

void non_handler(int signo)
{
    std::cout << "处理：" << signo << std::endl;
}

int main()
{
    //::signal(2,SIG_IGN);
    ::signal(2, non_handler);

    // 1.对2号信号屏蔽
    sigset_t block, oblock;
    // 战上开辟的空间，因此需要清零
    sigemptyset(&block);
    sigemptyset(&oblock);
    // 1.1 添加2号信号
    // 我们只是在用户栈上设置了block的位图结构
    // 并没有设置进入内核中
    sigaddset(&block, 2);
    // 1.2 设置进入内核中
    sigprocmask(SIG_SETMASK, &block, &oblock);

    int cnt = 0;

    while (true)
    {
        // 2. 获取pending表
        sigset_t pending;
        sigpending(&pending);

        // 2.1 打印
        PrintfPending(pending);

        sleep(1);

        cnt++;

        if(cnt == 10)
        {
            std::cout<<"解除对2号信号的屏蔽"<<std::endl;
            sigprocmask(SIG_SETMASK,&oblock,nullptr);
        }
    }
    return 0;
}

// void hander(int signo)
// {
//     std::cout<<"get a new signal : "<< signo <<std::endl;
// }

// int main()
// {
//     //信号捕捉
//     //1.默认
//     //2.忽略
//     //3.自定义捕捉
//     //::signal(2,hander);
//     ::signal(2,SIG_IGN);//ingnore:忽略：本身就是一种信号捕捉的方法，动作是忽略
//     ::signal(2,SIG_DFL);//default :默认

//     while(true)
//     {
//         //暂停程序
//         pause();
//     }
// }